#include <iostream>
#include <signal.h>
#include <unistd.h>

//实验2：置0实在递达前还是递达后
void PrintPending(const sigset_t& pending)
{
    for(int i = 31; i >= 1; i--)
        std::cout << sigismember(&pending, i);

    std::cout << std::endl;
    sleep(1);
}
void handler(int signo)
{
    sigset_t pending;

    std::cout << "******************" <<std::endl;
    sigpending(&pending);
    PrintPending(pending);
    std::cout << "******************" <<std::endl;

    std::cout << signo << std::endl;
}
int main()
{
    std::cout << getpid() << std::endl;
    signal(2, handler);
    while(true)
    {
        sleep(1);
    }
}

//实验1：观察pending表
// void PrintPending(const sigset_t& pending)
// {
//     for(int i = 31; i >= 1; i--)
//         std::cout << sigismember(&pending, i);

//     std::cout << std::endl;
//     sleep(1);
// }
// void handler(int signo)
// {
//     std::cout << signo << std::endl;
// }
// int main()
// {
//     std::cout << getpid() << std::endl;
//     sigset_t block, oblock;
//     sigemptyset(&block); //必须的
//     sigemptyset(&oblock);
    
//     sigaddset(&block, SIGINT);
//     sigprocmask(SIG_BLOCK, &block, &oblock);

//     signal(2, handler);
//     sigset_t pending;
//     // sigemptyset(&pending); //不需要初始化

//     int cnt = 10;
//     while(true)
//     {
//         sigpending(&pending);
//         PrintPending(pending);
//         cnt--;
//         if(!cnt)
//         {
//             std::cout << "解除2号信号屏蔽" << std::endl;
//             sigprocmask(SIG_UNBLOCK, &block, &oblock);
//         }
//     }
// }